11 处理泛化关系

处理泛化关系

Pull Up Field(字段上移)

problem:两个类有相同的字段
solution:从子类中删除该字段并将其移动到超类

重构原因?

子类分别增长和开发,导致出现相同(或几乎相同)的字段和方法

Pull Up Method(方法上移)

problem:子类具有执行类似工作的方法
solution:使方法相同,然后将它们移动到相关的超类

重构原因?

子类彼此独立地增长和发展,导致相同(或几乎相同)的字段和方法。

Pull Up Constructor Body(构造函数本地上移)

problem:所有子类具有的构造函数代码大部分相同。
solution:创建一个超类构造函数,并将子类中相同的代码移动到它。在子类构造函数中调用超类构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Manager extends Employee {
public Manager(String name, String id, int grade) {
this.name = name;
this.id = id;
this.grade = grade;
}
//...
}

//======================after refactoring=========================

class Manager extends Employee {
public Manager(String name, String id, int grade) {
super(name, id);
this.grade = grade;
}
//...
}

重构原因?

子类构造器会隐式调用父类的默认构造,如果父类没有默认构造器,需要显示调用。
因此我们可以把子类中共有的初始化代码移到父类构造器中。

Push Down Method(方法下移)

problem:在父类中实现的方法只被一个(或少数几个)子类使用
solution:将这些方法移到子类中。

重构原因?

当初父类设计的通用方法实际上只被一个(少数几个)子类所使用

Push Down Field(字段下移)

problem:在父类中的字段只被一个(或少数几个)子类使用
solution:将这些字段移到子类中。

重构原因?

当初父类设计的通用字段实际上只被一个(少数几个)子类所使用

上面的一些重构手法让人感觉有些冲突,实际上何时采用何种手法,并没有明确的界限去规定,根据自己的感觉去判断通用性。

下面这些方法感觉彼此冲突,界限不明确,实用性暂时不高,暂时不分析,这里仅仅提供定义。

Extract Subclass

Problem: 一个类的特性仅仅在某些条件下被使用
Solution: 将这些特性移到子类中

Extract Superclass

Problem: 两个类有基本相同的字段和函数
Solution: 创建一个父类,把相同的字段和函数移进去

Extract Interface

Problem: 多个客户端使用类接口的相同部分。另一种情况:两个类中的部分接口是相同的
Solution: 将此相同部分移动到其自己的接口

Collapse Hierarchy

Problem: 有一个类层次结构,其子类实际上与其超类相同
Solution: 合并子类和超类

Form Template method

Problem:子类实现的算法包含相同顺序的类似步骤
Solution:将算法结构和相同的步骤移动到超类,并在子类中保留不同步骤的实现

Replace Inheritance with Delegation

Problem: 有一个仅使用其超类的一部分方法的子类(或者它不可能继承超类数据)
Solution: 创建一个字段并在其中放置一个超类对象,将方法委托给超类对象,并取消继承

Replace Delegation with Inheritance

Problem:一个类包含许多简单的方法,这些方法委托给另一个类的所有方法
Solution:使该类成为委托继承者,这使得委托方法变得不必要

本文标题:11 处理泛化关系

文章作者:Sun

发布时间:2019年01月15日 - 20:01

最后更新:2019年01月17日 - 20:01

原始链接:https://sunyi720.github.io/2019/01/15/refactoring/11 处理泛化关系/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。